package collection;

public class MyLinkedList{
    private Node first;//首节点
    private Node last;//尾节点
    private int size;//链表大小

    public MyLinkedList(){
        first =null;
        last=null;
        size=0;
    }
    /**
     * 尾部添加，实现add（Object obj）方法
     */
    public void add(Object obj){
        Node node=new Node(null,null,null);
        if (first==null){//说明LinkedList没有一个节点
            node.data=obj;//初始化第一个节点
            first=node;//第一个节点是node
            last=node;//第二个节点也是node
            size++;
        }
        else {
                node.data=obj;
                last.next=node;
                node.previous=last;//将last赋值给node.previous，将node.previous指向到last指向的节点
                last=node;//当前节点变为末尾节点
                size++;//链表大小加1

        }
    }
    /**
     * 实现get(int index)方法，获取index处的节点并返回Node;
     * 使用循环 遍历列表
     */
        public Node get(int index){
            RangeCheck(index);
            Node temp=null;
            if(index<(size>>1)){
                    temp=first;
                for (int i = 0; i <index; i++) {
                    temp=temp.next;
                }


            }else{
                temp=last;
                for (int i = size-1; i >index ; i--) {
                    temp=temp.previous;
                }
                
                
            }
                    return temp;
        }

    /**
     * 判断遍历的某一个元素是否越界
     * @param index
     */
    private void RangeCheck(int index) {
            if (index<0||index>=size){

                throw new IndexOutOfBoundsException("IndexOutBounds"+index);
            }
    }
    /**
     * 任意位置插入，实现add(int index,Object obj)方法
     */
    public void add(int index,Object obj){
        RangeCheck(index);//对传入的索引必须进行检查，是否越界

        Node node=new Node(null,null,null);
        node.data=obj;

        Node node2=first;
        for (int i = 0; i <index-1 ; i++) {
                node2=node2.next;
        }
        node.next=node2.next;
        node2.next.previous=node;
        node2.next=node;
        node.previous=node2;
        size++;

        //node.next=node2.next;
        //node2.next.previous=node;




    }



}

